﻿Imports Lourdes.BackEnd.BC
Imports Lourdes.BackEnd.Interfaces
Imports Lourdes.BackEnd.View
Imports Lourdes.BackEnd.Modelo
Imports Lourdes.BackEnd

Public Class Facturar
  Private _vFact As vFacturacion
  Private _intIdFact As Integer
  Public Sub New(pViewFacturacion As vFacturacion)
    _vFact = pViewFacturacion
  End Sub

  Public Function Facturar() As Integer
    Dim bcFact As BC_Factura
    Dim bcFactDet As BC_FacturaDetalle
    Try
      bcFact = New BC_Factura
      bcFactDet = New BC_FacturaDetalle
      CalcularCabeceraFact()
      _intIdFact = bcFact.FacturaCabeceraAddOne(_vFact.Cabecera)
      bcFactDet.FacturaDetalleAddFromView(_vFact.Productos, _intIdFact)
      ActualizaStock()
      ActualizaPersonaCtaCte()
      Return _intIdFact
    Catch ex As Exception
      Throw ex
    End Try
  End Function

  'Rutina que se encarga de calcular los valores que tienen los diferentes campos calculados
  'de la cabecera de la factura y guardarlos en el objeto.
  Private Sub CalcularCabeceraFact()
    Dim dblTotalBruto As Double
    Dim dblDesc As Double
    Dim dblGastAdic As Double
    Dim dblImpuestos As Double
    Dim dblTotalNeto As Double

    dblTotalNeto = _vFact.Productos.Sum(Function(o) o.TotalLinea)
    dblDesc = _vFact.Productos.Sum(Function(o) o.Descuentos)
    dblImpuestos = _vFact.Cabecera.FacturaBase.Impuestos '0 'no esta en los productos el impuesto que se aplica. VER
    dblGastAdic = _vFact.Productos.Sum(Function(o) o.Gastos)
    For Each unProd In _vFact.Productos
      dblTotalBruto += unProd.Cantidad * unProd.Precio
    Next

    With _vFact.Cabecera.FacturaBase
      .TotalNeto = Math.Round(dblTotalNeto + dblImpuestos)
      .TotalBruto = dblTotalBruto
      .Descuentos = dblDesc
      .GastosAdicionales = dblGastAdic
      .Impuestos = Math.Round(dblImpuestos)
    End With

  End Sub

  Private Sub ActualizaStock()
    'obtener los numeros de serie de la mercaderia que se facturo.
    'para esto ir a la tabla MercaderiaNroSerie y obtener las mercaderías mas
    'cercanas al vencimiento cuyo DocEgresoId es nulo, 
    'cargando en el campo DocEgresoId el numero de documento de la factura
    'En caso de no haber ninguno disponible, ignorar
    'De lo anterior, si corresponde, obtener los numeros de serie de la 
    'mercaderia vendida en la factura.

    'Actualizar la cuenta corriente de mercadería
    'En tabla MercaderiaCtaCte cargar por cada mercaderia, la cantidad que se va por el 
    'haber y en DocId poner una referencia al DocId de la factura. Recalcular el saldo, en base
    'al stock existente en la tabla de mercaderías.

    'Actualizar tabla de Mercadería de acuerdo a las cantidades de mercadería facturadas. Puede quedar
    'el stock en negativo.    
    Dim bcMerNroSerie As New BC_MercaderiaNrosDeSerie
    Dim bcMerCtaCte As New BC_MercaderiaCtaCte
    Dim bcMer As New BC_Mercaderia
    For Each unproducto In _vFact.Productos
      bcMerNroSerie.RetirarDeStock(unproducto.MercaderiaId, unproducto.Cantidad, _vFact.Cabecera.FacturaBase.DocId)
      bcMerCtaCte.Operacion(unproducto.MercaderiaId, unproducto.Cantidad, _vFact.Cabecera.FacturaBase.DocId, Enums.CtaCteMovTipo.Debe)
      bcMer.DisminuirStock(unproducto.MercaderiaId, unproducto.Cantidad)
    Next


  End Sub

  Private Sub ActualizaPersonaCtaCte()
    'Actualiza la tabla PersonaCtaCte con el monto de la factura en el debe y una referencia al docid de la misma.
    'Luego si se presiona el boton "Pagado" un recibo se va a encargar de compensar la cta cte.
    Dim bcPerCtaCte As New BC_PersonaCtaCte
    bcPerCtaCte.Operacion(_vFact.Cabecera.FacturaBase.ClientePerId, _
                          _vFact.Cabecera.FacturaBase.TotalNeto, _
                          _vFact.Cabecera.FacturaBase.DocId, _
                          Enums.CtaCteMovTipo.Debe)
  End Sub
End Class
